package com.erp.utils;


import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.Version;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.Map;

public class FreemarkerUtil {

    public static  Template getTemplate(String ftlName,String ftlPath){
        try {
            //通过Freemarker的Configuration读取相应的ftl
            Configuration configuration = new Configuration(Configuration.VERSION_2_3_23);
            configuration.setDefaultEncoding("UTF-8");

            //这里是对应的你使用jar包的版本号：<version>2.3.23</version>
           //configuration.setDirectoryForTemplateLoading(new File("/ftl"));
            // 如果是maven项目可以使用这种方式
            //第二个参数 为你对应存放.ftl文件的包名
            configuration.setClassForTemplateLoading(FreemarkerUtil.class, ftlPath);//"/ftl"

            Template template = configuration.getTemplate(ftlName,"UTF-8");

            return template;
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }
    //在控制台输出内容
    public static void print(String name,Map<String, Object> root,String ftlPath){
        //通过Template可以将模版文件输出到相应的文件流
        Template template = getTemplate(name,ftlPath);
        try {
            template.process(root, new PrintWriter(System.out));
            //在控制台输出内容
        } catch (TemplateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    /**
     * 输出HTML文件
     *
     * @param name  模板名称
     * @param root 数据集
     * @param outFile  输出文件
     */
    public static void printToFile(String name, Map<String, Object> root, String outFile,String ftlPath) {
        FileWriter out = null;
        try {
           // 通过一个文件输出流，就可以写到相应的文件中，此处用的是绝对路径
            out = new FileWriter(new File("D:/new_works/freeMarker/src/static/" + outFile));
            Template temp = getTemplate(name,ftlPath);
            temp.process(root, out);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TemplateException e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null)
                    out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     *
     * @param name  模板名称
     * @param root 数据集
     * @param ftlPath  模板路径
     * @param response
     */
    public static void printToHtml(String name, Map<String, Object> root,  String ftlPath, HttpServletResponse response) {
       PrintWriter out = null;
        try {
            out=response.getWriter();
            // 通过一个文件输出流，就可以写到相应的文件中，此处用的是绝对路径
          //  out = new FileWriter(new File("D:/new_works/freeMarker/src/static/" + outFile));
            Template temp =  getTemplate(name,ftlPath);
            temp.process(root, out);
        } catch (Exception e) {
            e.printStackTrace();
        }  finally {
            try {
                if (out != null)
                    out.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 使用FreeMarker自动生成Word文档
     * @param dataMap   生成Word文档所需要的数据
     * @param fileName  生成Word文档的全路径名称
     */
    public static void generateWord(Map<String, Object> dataMap, String fileName) throws Exception {
        // 设置FreeMarker的版本和编码格式
        Configuration configuration = new Configuration(new Version("2.3.28"));
        configuration.setDefaultEncoding("UTF-8");

        // 设置FreeMarker生成Word文档所需要的模板的路径
        configuration.setDirectoryForTemplateLoading(new File("E:/Word/Template/"));
        // 设置FreeMarker生成Word文档所需要的模板
        Template t = configuration.getTemplate("WordTemplate.ftl", "UTF-8");
        // 创建一个Word文档的输出流
        Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(fileName)), "UTF-8"));
        //FreeMarker使用Word模板和数据生成Word文档
        t.process(dataMap, out);
        out.flush();
        out.close();
    }
}